#include "openfile.h"


/**
 * @breif Class File construction function
 * @para
 * @return
*/
File::File(QString data)
{
    QString raw_data = QString(data); //raw data in hex
    QString ascii_data = QString(QByteArray::fromHex(raw_data.toLatin1().data()));
    QByteArray hexData = QByteArray::fromHex(raw_data.toLatin1());
    if (hexData.isEmpty()) {
        qWarning() << "Invalid hex data!";
        return;
    }
    m_raw_data.append(ascii_data);
    qDebug()<<"received raw data in ascii:"<<ascii_data;
}

/**
 * @breif Class File construction function
 * @para
 * @return
*/
File::File(QByteArray data)
{
    QString raw_data = QString(data); //raw data in hex
    QString ascii_data = QString(QByteArray::fromHex(raw_data.toLatin1().data()));
    QByteArray hexData = QByteArray::fromHex(raw_data.toLatin1());
    if (hexData.isEmpty()) {
        qWarning() << "Invalid hex data!";
        return;
    }
    m_raw_data.append(ascii_data);
    qDebug()<<"received raw data in ascii:"<<ascii_data;
}

/**
 * @breif 收到报文 解析 文件名和文件数据
 * @breif 把 m_raw_data中的数据按 tag分，文件名->m_name   文件数据->m_data
 * @para QString input  输入报文
 * @return
*/
void File::AnalyseRawData()
{
    QStringList raw_data_list = m_raw_data.split("\r\n",QString::SkipEmptyParts);

    if(m_raw_data == "\r\n")///< 空白行
    {
        m_data.append("\n");
        File::WriteFile();

        m_data.clear();
        m_current_file.clear();
    }
    qDebug()<<"=============================================start analyse =============================================\n"<<"we seperate all this raw data by [tag\n"<<"size: "<<raw_data_list.size()<<raw_data_list<<"\nWRITING............";
    for(int i = 0; i < raw_data_list.size(); i++)
    {
        QString file_name = raw_data_list.at(i);qDebug()<<file_name;
        if(file_name.left(13) == "[tagFilename]")//filename
        {
            m_name.clear();
            m_name.append(file_name.mid(13));
           // File::CreateFile();

            //m_data.append("");
            File::WriteFile();

            m_data.clear();
            m_current_file.clear();
        }
        else if(file_name.left(13) == "[tagFiledata]")
        {
            m_data.append(file_name.mid(13));
            File::WriteFile();

            m_data.clear();
            m_current_file.clear();
        }
        else if(file_name.left(12) == "[tagFiledir]")
        {
            m_name.clear();
            m_name.append(file_name.mid(12));
            File::CreateDir();
        }
        else
        {
            if(!m_name.isEmpty())
            {
                m_data.append("\n" + file_name);
                File::WriteFile();

                m_data.clear();
                m_current_file.clear();
            }
        }

    }
}


/**
 * @breif 把M_data的数据写入m_name的文件中去
 * @para
 * @return
*/
void File::WriteFile()
{

    qDebug()<<"writeto"<<m_name<<"write data:"<<m_data;
    ///< 组地址
    QStringList dirs = m_name.split("\\", QString::SkipEmptyParts);
    QString dir = QString(QDir:: currentPath() + "/Filerecv" );
    for(int i = 0; i < dirs.size(); i++)
    {
        dir += ( "/" + dirs.at(i));
    }
    qDebug()<<"writeto"<<dir<<"write data:"<<m_data;

    ///< 写入
    QFile file(dir);
    file.open(QIODevice::ReadWrite|QIODevice::Text|QIODevice::Append);
    file.write(m_data);
    file.close();
}

/**
 * @breif 根据m_name 创建文件
 * @para
 * @return
*/
void File::CreateDir()
{
    qDebug()<<"create file:"<<m_name;
    ///< 1.Resolve file name by '\'
    QStringList dirs = m_name.split("\\", QString::SkipEmptyParts);
qDebug()<<dirs;
    ///< 2.不管几层目录都在filerecv目录下
    m_current_dir.setPath(QDir::currentPath());
    if(!m_current_dir.exists("Filerecv"))
    {
        m_current_dir.mkdir(".//Filerecv");
    }

    ///< 3.创建目录
    m_current_dir.cd("./Filerecv");
    QString directory(m_current_dir.path());
    for(int i = 0 ; i < dirs.size(); i ++)///< 最外层文件
    {

        directory.append("/" + dirs.at(i));
    }

    QDir dir(directory);
    if(dir.exists())
        dir.remove(directory);
    if(!dir.mkdir(directory))
        qDebug()<<"mkdir"<<directory<<"failed";
    m_current_dir.cd(directory);

    m_current_file.append(m_current_dir.path());
}

/**
 * @breif 把file_dir中包含root_dir的部分去掉
 * @para QString input 要输入的字符串
 * @return
*/
QString Dir2Name(QString root_dir,QString file_dir)
{
    QStringList root = root_dir.split('\\');
    QStringList file = file_dir.split("/");

    int i = 0;
    for(; i < root.size(); i++)
    {
        if(root.at(i) == file.at(i))//包含
        {
            continue;
        }
        else
        {
            break;
        }
    }
    if(i > root.size())
        return QString("error");


    QString result;
    for(; i < file.size(); i++)
    {
        result.append("\\");
        result.append("\\");///< 字符传输过程会转义
        result.append(file.at(i));
        qDebug()<<file.at(i);
    }

    return result;
}

/**
 * @breif SendFile constructor func
 * @breif 装载一个文件
 * @para QString file path 文件地址
 * @return
 */
SendFile::SendFile(QString filepath)
{
    m_file.append(filepath);
    qDebug()<<filepath;
}

SendFile::~SendFile()
{

}

/**
 * @breif m_file路径的文件，把文件信息，文件内容装载好
 * @breif 装载一个文件，根据文件地址，打开文件，把文件内容返回
 * @para QString file path 文件地址
 * @return
 */
void SendFile::FileDataSave()
{
    ///< file info
    QFile file(m_file);
    m_size = static_cast<int>(file.size());
    ///< clear data buffer
    if (!file.open(QIODevice::ReadOnly))
    {
        qWarning() << "无法打开文件";
        return;
    }
    else
    {
        ///<  二进制读取 QbyteArray
        /// 并采用分块读取
        const qint64 bufferSize = 1 * 1024 * 1024; // 每次读取 1MB
        QByteArray buffer;
        buffer.resize(bufferSize);

        qint64 bytesRead;
        while ((bytesRead = file.read(buffer.data(), bufferSize)) > 0)
        {
            // 处理读取的数据块
            qDebug() << "读取了" << bytesRead << "字节";
            // 这里可以对 buffer 进行处理，例如写入另一个文件或进行其他操作
            qDebug()<<"buffer (hex):" << buffer.left(bytesRead).toHex()<<"buffer.data"<<buffer.data();
            m_data.append(buffer.left(bytesRead));
            //qDebug()<<"m_data = "<<m_data;
        }

        file.close();
    }
}

/**
 * @breif Write Bianry Data to File
 * @para filePath:Binary File adress
 * @para data:data
 * @return
*/
void writeBinaryDataToFile(const QString &filePath, const QByteArray &data)
{
    QFile file(filePath);

    // 打开文件（如果文件不存在则创建，如果存在则覆盖）
    if (!file.open(QIODevice::WriteOnly)) {
        qWarning() << "无法打开文件:" << filePath;
        return;
    }

    // 写入二进制数据
    qint64 bytesWritten = file.write(data);
    if (bytesWritten == -1) {
        qWarning() << "写入文件失败";
    } else {
        qDebug() << "成功写入" << bytesWritten << "字节数据到文件:" << filePath;
    }

    // 关闭文件
    file.close();
}
